package com.ruoyi.combat.service.impl;

import java.nio.charset.StandardCharsets;
import java.util.*;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.combat.domain.CombatMethod;
import com.ruoyi.combat.domain.MethodUseLog;
import com.ruoyi.combat.domain.PredictRelationshipInfo;
import com.ruoyi.combat.mapper.CombatMethodMapper;
import com.ruoyi.combat.service.ICombatMethodService;
import com.ruoyi.combat.util.MethodUseUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 课题算法管理Service业务层处理
 *
 * @author ruoyi
 * @date 2025-01-09
 */
@Service
public class CombatMethodServiceImpl implements ICombatMethodService
{
    @Autowired
    private CombatMethodMapper combatMethodMapper;

    @Autowired
    private MethodUseUtils methodUseUtils;

    @Autowired
    private SysConfigMapper sysConfigMapper;

    /**
     * 查询课题算法管理
     *
     * @param id 课题算法管理主键
     * @return 课题算法管理
     */
    @Override
    public CombatMethod selectCombatMethodById(Long id)
    {
        return combatMethodMapper.selectCombatMethodById(id);
    }

    /**
     * 查询课题算法管理列表
     *
     * @param combatMethod 课题算法管理
     * @return 课题算法管理
     */
    @Override
    public List<CombatMethod> selectCombatMethodList(CombatMethod combatMethod)
    {
        return combatMethodMapper.selectCombatMethodList(combatMethod);
    }

    /**
     * 新增课题算法管理
     *
     * @param combatMethod 课题算法管理
     * @return 结果
     */
    @Override
    public int insertCombatMethod(CombatMethod combatMethod)
    {
        return combatMethodMapper.insertCombatMethod(combatMethod);
    }

    /**
     * 修改课题算法管理
     *
     * @param combatMethod 课题算法管理
     * @return 结果
     */
    @Override
    public int updateCombatMethod(CombatMethod combatMethod)
    {
        return combatMethodMapper.updateCombatMethod(combatMethod);
    }

    /**
     * 批量删除课题算法管理
     *
     * @param ids 需要删除的课题算法管理主键
     * @return 结果
     */
    @Override
    public int deleteCombatMethodByIds(Long[] ids)
    {
        return combatMethodMapper.deleteCombatMethodByIds(ids);
    }

    /**
     * 删除课题算法管理信息
     *
     * @param id 课题算法管理主键
     * @return 结果
     */
    @Override
    public int deleteCombatMethodById(Long id)
    {
        return combatMethodMapper.deleteCombatMethodById(id);
    }

    @Override
    public Object testCombatMethodById(Long id) {
        CombatMethod combatMethod = combatMethodMapper.selectCombatMethodById(id);
        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("data", combatMethod.getMethodParam());
        Map<String, Object> result = methodUseUtils.methodUser(id, requestBody);
        return result;
    }

    @Override
    public String testCombatMethod(CombatMethod combatMethod) {
        if ("基于时延混淆的抗定位(网关)".equals(combatMethod.getMethodName())) {
            SysConfig sysConfig = sysConfigMapper.selectConfigById(7L);
            if ("false".equals(sysConfig.getConfigValue())) {
                return null;
            }
        }


        String methodParam = combatMethod.getMethodParam();
        String methodUrl = combatMethod.getMethodUrl();
        if ("确定风险抗归属任务状态查询算法".equals(combatMethod.getMethodName())
                || "确定风险抗归属更新代理算法".equals(combatMethod.getMethodName())
                || "确定风险抗归属组织关系更新算法".equals(combatMethod.getMethodName())
                || "网络抗归属开启算法".equals(combatMethod.getMethodName())
                || "网络抗归属停止方法".equals(combatMethod.getMethodName())) {
            SysConfig sysConfig = sysConfigMapper.selectConfigById(8L);
            if ("false".equals(sysConfig.getConfigValue())) {
                // 调用确定抗归属算法
                String result = "交易成功";
                return result;
            }
            if ("确定风险抗归属更新代理算法".equals(combatMethod.getMethodName())) {
                // http post请求，给请求头添加参数
                String proxypass = "http://" + combatMethod.getMethodParam();
                Map<String, Object> proxypassMap = new HashMap<>();
                proxypassMap.put("proxypass", proxypass);
                String proxypassResult = methodUseUtils.methodUseLogs(35L, proxypassMap, "admin", "password");
                return proxypassResult;
            }
            if ("确定风险抗归属组织关系更新算法".equals(combatMethod.getMethodName())) {
                List<Map<String, Object>> orgList = new ArrayList<>();
                Map<String, Object> orgMap = new HashMap<>();
                orgMap.put("old", "天津市大学软件学院");
                orgMap.put("new", "天津美术学院");
                orgList.add(orgMap);
                String result = methodUseUtils.methodUseLogs(36L, orgList, "admin", "password");
                return result;
            }
            // http post请求，给请求头添加参数
            String authCredentials = "admin" + ":" + "password";
            String encodedAuth = Base64.getEncoder().encodeToString(authCredentials.getBytes(StandardCharsets.UTF_8));
            String basicAuthHeader = "Basic " + encodedAuth;
            HttpResponse post = HttpRequest.post(combatMethod.getMethodUrl())
                    .header("Authorization", basicAuthHeader)
                    .execute();
            return post.body();

        } else if ("网络目标IP归属保护实时查询数据算法".equals(combatMethod.getMethodName())) {
            if ("false".equals(sysConfigMapper.selectConfigById(8L).getConfigValue())) {
                return "[{\"_id\":\"60.168.129.153-80\",\"ip\":\"60.168.129.153\",\"ip_c\":\"60.168.129\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"114.214.207.86-22\",\"ip\":\"114.214.207.86\",\"ip_c\":\"114.214.207\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"36.33.240.49-4369\",\"ip\":\"36.33.240.49\",\"ip_c\":\"36.33.240\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"36.7.138.223-2222\",\"ip\":\"36.7.138.223\",\"ip_c\":\"36.7.138\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"36.33.216.68-1000\",\"ip\":\"36.33.216.68\",\"ip_c\":\"36.33.216\",\"f_domain\":\"iflytek.com\",\"domain\":null,\"O\":\"科大讯飞股份有限公司\",\"CN\":\"*.iflytek.com\",\"sn_name\":null,\"org\":\"科大讯飞股份有限公司\"},{\"_id\":\"114.213.144.139-53\",\"ip\":\"114.213.144.139\",\"ip_c\":\"114.213.144\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"210.45.120.55-8443\",\"ip\":\"210.45.120.55\",\"ip_c\":\"210.45.120\",\"f_domain\":null,\"domain\":null,\"O\":\"k8s\",\"CN\":\"kubernetes\",\"sn_name\":null,\"org\":\"k8s\"},{\"_id\":\"222.195.70.230-888\",\"ip\":\"222.195.70.230\",\"ip_c\":\"222.195.70\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"60.168.49.223-49153\",\"ip\":\"60.168.49.223\",\"ip_c\":\"60.168.49\",\"f_domain\":\"qiyou.cn\",\"domain\":null,\"O\":\"qiyou\",\"CN\":\"qiyou.cn\",\"sn_name\":null,\"org\":\"qiyou\"},{\"_id\":\"39.134.125.154-7000\",\"ip\":\"39.134.125.154\",\"ip_c\":\"39.134.125\",\"f_domain\":\"migu.cn\",\"domain\":null,\"O\":\"咪咕文化科技有限公司\",\"CN\":\"*.migu.cn\",\"sn_name\":null,\"org\":\"咪咕文化科技有限公司\"},{\"_id\":\"112.30.200.205-8087\",\"ip\":\"112.30.200.205\",\"ip_c\":\"112.30.200\",\"f_domain\":\"ihou.com\",\"domain\":null,\"O\":null,\"CN\":\"*.ihou.com\",\"sn_name\":null,\"org\":null},{\"_id\":\"114.97.189.85-5001\",\"ip\":\"114.97.189.85\",\"ip_c\":\"114.97.189\",\"f_domain\":\"0551gs.com\",\"domain\":null,\"O\":null,\"CN\":\"file.0551gs.com\",\"sn_name\":null,\"org\":null},{\"_id\":\"120.209.164.193-993\",\"ip\":\"120.209.164.193\",\"ip_c\":\"120.209.164\",\"f_domain\":\"psbc-ubank.com\",\"domain\":null,\"O\":\"中邮邮惠万家银行有限责任公司\",\"CN\":\"*.huibangong.psbc-ubank.com\",\"sn_name\":null,\"org\":\"中邮邮惠万家银行有限责任公司\"},{\"_id\":\"60.174.227.58-3306\",\"ip\":\"60.174.227.58\",\"ip_c\":\"60.174.227\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"210.45.215.199-80\",\"ip\":\"210.45.215.199\",\"ip_c\":\"210.45.215\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"210.45.246.58-443\",\"ip\":\"210.45.246.58\",\"ip_c\":\"210.45.246\",\"f_domain\":\"hfut.edu.cn\",\"domain\":null,\"O\":\"合肥工业大学\",\"CN\":\"*.hfut.edu.cn\",\"sn_name\":\"合肥工业大学\",\"org\":\"合肥工业大学\"},{\"_id\":\"112.27.118.83-8082\",\"ip\":\"112.27.118.83\",\"ip_c\":\"112.27.118\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"60.174.233.240-21\",\"ip\":\"60.174.233.240\",\"ip_c\":\"60.174.233\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"112.30.214.61-80\",\"ip\":\"112.30.214.61\",\"ip_c\":\"112.30.214\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"39.134.125.137-7000\",\"ip\":\"39.134.125.137\",\"ip_c\":\"39.134.125\",\"f_domain\":\"migu.cn\",\"domain\":null,\"O\":\"咪咕文化科技有限公司\",\"CN\":\"*.migu.cn\",\"sn_name\":null,\"org\":\"咪咕文化科技有限公司\"},{\"_id\":\"144.48.66.148-888\",\"ip\":\"144.48.66.148\",\"ip_c\":\"144.48.66\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"218.23.109.237-6060\",\"ip\":\"218.23.109.237\",\"ip_c\":\"218.23.109\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"220.180.238.73-9090\",\"ip\":\"220.180.238.73\",\"ip_c\":\"220.180.238\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"103.8.34.136-8086\",\"ip\":\"103.8.34.136\",\"ip_c\":\"103.8.34\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"117.71.57.111-9090\",\"ip\":\"117.71.57.111\",\"ip_c\":\"117.71.57\",\"f_domain\":null,\"domain\":null,\"O\":null,\"CN\":null,\"sn_name\":null,\"org\":null},{\"_id\":\"222.195.70.186-8443\",\"ip\":\"222.195.70.186\",\"ip_c\":\"222.195.70\",\"f_domain\":\"ustc.edu.cn\",\"domain\":null,\"O\":\"USTC\",\"CN\":\"ustc.edu.cn\",\"sn_name\":null,\"org\":\"USTC\"}...";
            }
            HttpResponse response = HttpRequest.get(combatMethod.getMethodUrl())
                    .setFollowRedirects(true)  // 启用自动重定向
                    .execute();
            return response.body();
        } else if ("IP归属关系预测算法".equals(combatMethod.getMethodName())) {
            return "\t{\"results\":{\"211.68.251.54\":{\"top_organization\":{\"org\":\"天津农学院\",\"total_score\":1.6,\"paths\":[{\"via_ip\":\"211.68.251.27\",\"domains\":[],\"ip_cs\":[\"211.68.251\"],\"cities\":[\"天津市\"],\"score\":1.6}]},\"error\":null}}}";
        } else if ("IP归属预测风险对抗算法".equals(combatMethod.getMethodName())) {
            return "{\"suggestions\":[{\"ip\":\"211.68.251.54\",\"modified_ips\":[\"211.68.251.27\"]}],\"analysis_results\":{\"211.68.251.54\":{\"top_organization\":{\"org\":\"天津美术学院\",\"total_score\":0.5,\"paths\":[{\"via_ip\":\"202.113.216.147\",\"domains\":[],\"ip_cs\":[],\"cities\":[\"天津市\"],\"score\":0.1},{\"via_ip\":\"202.113.216.12\",\"domains\":[],\"ip_cs\":[],\"cities\":[\"天津市\"],\"score\":0.1},{\"via_ip\":\"202.113.216.40\",\"domains\":[],\"ip_cs\":[],\"cities\":[\"天津市\"],\"score\":0.1},{\"via_ip\":\"202.113.216.122\",\"domains\":[],\"ip_cs\":[],\"cities\":[\"天津市\"],\"score\":0.1},{\"via_ip\":\"202.113.216.144\",\"domains\":[],\"ip_cs\":[],\"cities\":[\"天津市\"],\"score\":0.1}]},\"error\":null}},\"original_top_orgs\":{\"211.68.251.54\":{\"org\":\"天津农学院\",\"total_score\":1.6,\"paths\":[{\"via_ip\":\"211.68.251.27\",\"domains\":[],\"ip_cs\":[\"211.68.251\"],\"cities\":[\"天津市\"],\"score\":1.6}]}},\"status\":\"对抗停止\"}";
        } else if ("预测风险抗归属任务状态查询算法".equals(combatMethod.getMethodName())) {
            return "{\"adversarial_status\":\"对抗停止\"}";
        }
        if ("POST".equals(combatMethod.getMethodType())||"post".equals(combatMethod.getMethodType())) {
            if ("app越权访问检测算法1".equals(combatMethod.getMethodName())) {
                Map bean = JSONUtil.toBean(methodParam, Map.class);
                return HttpUtil.post(methodUrl, bean);
            }
            return HttpUtil.post(methodUrl, methodParam);
        } else if ("GET".equals(combatMethod.getMethodType())) {
            HttpRequest request = HttpRequest.get(combatMethod.getMethodUrl())
                    .header("Content-Type", "application/json");
            request.body(methodParam);
            return request.execute().body();
        }
        return null;
    }
}
